/**
 * @typedef {import('../../Func/add_remove_eventListen').eventA} eventA
 */

import {
  ObjectOnlyPushSet,
  removeObjectOnlyPushSet,
} from '../../../../Func/uniFunc/Func/ObjectOnlyPushSet_operate';
import { locate_uniArr_info } from './cla_listenEvent_info_mana';

const freeze_listenEvent_info_manaTag = 'freeze_listenEvent_info_mana';

class freeze_listenEvent_info_mana {
  get [Symbol.toStringTag]() {
    return freeze_listenEvent_info_manaTag;
  }

  /**
   *
   * @param { unit_listenEvent_mana} that
   */
  constructor(that) {
    this.that = that;
  }

  /**
   *
   * @type {unit_listenEvent_mana}
   */
  that;

  /**
   * 用于 记录 该 命名空间下 操作的数据
   * @type {listenEvent_info[]}
   */
  operated_Info = [];

  /**
   * 根据 给定 的数据信息 判定 绑定 的 信息组 进行 解绑
   * @param {HTMLElement | HTMLElement[]} targetElArr 指定 元素
   * @param {eventA | eventA[]} eventArr 指定 元素 事件
   * @param {function | function[]} fnArr 指定 函数
   */
  freeze(targetElArr, eventArr, fnArr) {
    let ret = this.that.on.stack;

    ret = locate_uniArr_info(ret, { targetElArr, eventArr, fnArr });

    for (const uniInfo of ret) {
      let { targetEl, event, fn, options } = uniInfo;
      this.that.removeEventListen(targetEl, event, fn, options);
      ObjectOnlyPushSet(this.operated_Info, uniInfo);
      uniInfo.frozen_status = true;
    }

    return ret;
  }

  /**
   * 根据 给定 的数据信息 判定 绑定 的 信息组 进行 绑定
   * @param {HTMLElement | HTMLElement[]} targetElArr 指定 元素
   * @param {eventA | eventA[]} eventArr 指定 元素 事件
   * @param {function | function[]} fnArr 指定 函数
   */
  unfreeze(targetElArr, eventArr, fnArr) {
    let ret = this.operated_Info;

    ret = locate_uniArr_info(ret, { targetElArr, eventArr, fnArr });

    for (const uniInfo of ret) {
      let { targetEl, event, fn, options } = uniInfo;
      this.that.addEventListen(targetEl, event, fn, options);
      removeObjectOnlyPushSet(this.operated_Info, uniInfo);
      uniInfo.frozen_status = false;
    }

    return ret;
  }

  /**
   * 解除 所有 当前 名下 的 freeze 信息
   */
  unfreezeAll() {
    for (const uniInfo of this.operated_Info) {
      if (!uniInfo.frozen_status) {
        return;
      }
      let { targetEl, event, fn, options } = uniInfo;
      this.that.addEventListen(targetEl, event, fn, options);
      uniInfo.frozen_status = false;
    }
    this.operated_Info = [];
  }
}

export { freeze_listenEvent_info_mana };
